welo git mirrors
src/forwarding.rs 7eec35ad5473bb3ef44f8d33a6ecdfc7c4c7c215 (7eec35ad) Text, 6.22 KB
T8b949e//! port forwarding command
T8b949e//! can either be done server side or client side.
T8b949e//! for server side it just runs a regular socksv5 server but disables all possible addresses except
T8b949e//! localhost for the specified ports. A regular socksv5 server is backwards compatiable and would work
T8b949e//!
T8b949e//! for client side, things are slightly changed, internally a socksv5 proxy is still used
T8b949e//! but it's not exposed, instead ports whatever ports you selected. is opened and whatever traffic
T8b949e//! you send to it get forwarded to the remote server to the remote socket. allowing you to directly
T8b949e//! connect an application to that port and have it be connected to the remote server.
T8b949e//!
T8b949e//! rns-proxy forward -u 43 -t 80
T8b949e//! rns-proxy connect -U 43:43 -u 80:80 443:443
T8b949e//!
T8b949e//! -t flag means onyl tcp is connected to
T8b949e//! -u flag means udp only
T8b949e//! -b flag attempts does both udp and tcp
Tff7b72use Te6edf3std::Tb4b4b4{Te6edf3net::Tb4b4b4{Te6edf3Ipv4AddrTb4b4b4, Te6edf3SocketAddrTb4b4b4}Tb4b4b4, Te6edf3sync::Te6edf3ArcTb4b4b4}Tb4b4b4;
Tff7b72use Te6edf3fast_socks5::Te6edf3util::Te6edf3target_addr::Te6edf3TargetAddrTb4b4b4;
Tff7b72use Te6edf3log::Tb4b4b4{Te6edf3errorTb4b4b4, Te6edf3infoTb4b4b4, Te6edf3warnTb4b4b4}Tb4b4b4;
Tff7b72use Te6edf3tokio::Tb4b4b4{Te6edf3net::Tb4b4b4{Te6edf3TcpListenerTb4b4b4}Tb4b4b4, Te6edf3sync::Te6edf3NotifyTb4b4b4, Tb4b4b4}Tb4b4b4;
Tff7b72use Te6edf3udp_stream::Te6edf3UdpListenerTb4b4b4;
Tff7b72use Tff7b72crate::Tb4b4b4{Te6edf3client::Tb4b4b4{Te6edf3connect_tcp_server_sideTb4b4b4, Te6edf3udp_bind_connectTb4b4b4}Tb4b4b4, Te6edf3mux::Te6edf3MuxHandleTb4b4b4, Te6edf3relay::Tb4b4b4{Te6edf3relay_forwarded_tcpTb4b4b4, Te6edf3relay_forwarded_udpTb4b4b4}Tb4b4b4}Tb4b4b4;
Tff7b72#[Tff7b72derive(Clone, Debug)Tff7b72]
Tff7b72pub Tff7b72enum T56d364PortType Tb4b4b4{
Te6edf3TcpTb4b4b4,
Te6edf3UdpTb4b4b4,
Te6edf3TcpUdpTb4b4b4,
Tb4b4b4}
Tff7b72#[Tff7b72derive(Clone, Debug)Tff7b72]
Tff7b72pub Tff7b72struct T56d364ForwardedPort Tb4b4b4{
Tff7b72pub Te6edf3server_port: Tffa657u16Tb4b4b4,
Tff7b72pub Te6edf3client_port: Tffa657u16Tb4b4b4,
Tff7b72pub Te6edf3r#Tff7b72type: T56d364PortType
Tb4b4b4}
T8b949e/// basically:
T8b949e/// 1. open up tcp listener
T8b949e/// 2. every type a program like a webpage tries to connect to the local socket
T8b949e/// it must be from a different tcp port. So we know what program is what based on that.
T8b949e/// so we send a connect request to the reticulm server socks server a CONNECT request
T8b949e/// 3. any time a new tcp packet arrives then add the destination localhost port of the reticulum server
T8b949e/// and any time we receive data we figure out which stream it corresponds to and send it back
T8b949e///
T8b949e///
Tff7b72pub Tff7b72async Tff7b72fn Td2a8fftcp_tunnelTb4b4b4(Te6edf3mux: T56d364MuxHandleTb4b4b4, Te6edf3reconnect_notify: T56d364ArcTff7b72<Te6edf3NotifyTff7b72> Tb4b4b4, Te6edf3port: T56d364ForwardedPortTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3listener Tff7b72= Tff7b72match Te6edf3TcpListener::Te6edf3bindTb4b4b4(Tff7b72format!Tb4b4b4(Ta5d6ff"Ta5d6ff127.0.0.1:{}Ta5d6ff"Tb4b4b4,Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4)Tb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Tffa657OkTb4b4b4(Te6edf3lTb4b4b4) Tff7b72=Tff7b72> Te6edf3lTb4b4b4,
Tffa657ErrTb4b4b4(Te6edf3eTb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Te6edf3errorTff7b72!Tb4b4b4(Ta5d6ff"Ta5d6ffFailed to local port at {} cause of {:?}Ta5d6ff"Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4, Te6edf3eTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3reference Tff7b72= Tff7b72&Te6edf3muxTb4b4b4;
Tff7b72loop Tb4b4b4{
Te6edf3tokio::Te6edf3selectTff7b72! Tb4b4b4{
Te6edf3accept_result Tff7b72= Te6edf3listenerTb4b4b4.Te6edf3acceptTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Tff7b72let Tb4b4b4(Te6edf3streamTb4b4b4, Te6edf3_addrTb4b4b4) Tff7b72= Tff7b72match Te6edf3accept_result Tb4b4b4{
Tffa657OkTb4b4b4(Te6edf3saTb4b4b4) Tff7b72=Tff7b72> Te6edf3saTb4b4b4,
Tffa657ErrTb4b4b4(Te6edf3_eTb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3mux Tff7b72= Te6edf3referenceTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tff7b72!Te6edf3muxTb4b4b4.Te6edf3is_connectedTb4b4b4(Tb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Tffa657dropTb4b4b4(Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3sid Tff7b72= Te6edf3muxTb4b4b4.Te6edf3next_session_idTb4b4b4(Tb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tff7b72let Tff7b72mut Te6edf3session_rx Tff7b72= Te6edf3muxTb4b4b4.Te6edf3register_sessionTb4b4b4(Te6edf3sidTb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tff7b72let Te6edf3mux_clone Tff7b72= Te6edf3muxTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3target_addr Tff7b72= Te6edf3TargetAddr::Te6edf3IpTb4b4b4(Te6edf3SocketAddr::Te6edf3newTb4b4b4(Te6edf3std::Te6edf3net::Te6edf3IpAddr::Te6edf3V4Tb4b4b4(Te6edf3Ipv4Addr::Te6edf3LOCALHOSTTb4b4b4)Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3server_portTb4b4b4)Tb4b4b4)Tb4b4b4; T8b949e// ask for any port client server side
Te6edf3tokio::Te6edf3spawnTb4b4b4(Tff7b72async Tff7b72move Tb4b4b4{
Tff7b72match Te6edf3connect_tcp_server_sideTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3muxTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72&Tff7b72mut Te6edf3session_rxTb4b4b4, Te6edf3target_addr Tb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Tffa657OkTb4b4b4(Tb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Te6edf3relay_forwarded_tcpTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3streamTb4b4b4, Te6edf3mux_cloneTb4b4b4, Te6edf3session_rxTb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tb4b4b4}
Tffa657ErrTb4b4b4(Te6edf3error_messageTb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Te6edf3warnTff7b72!Tb4b4b4(Ta5d6ff"Ta5d6ff[{}] could not connect forward cause of {}Ta5d6ff"Tb4b4b4, Te6edf3sidTb4b4b4, Te6edf3error_messageTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_ Tff7b72= Te6edf3reconnect_notifyTb4b4b4.Te6edf3notifiedTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
T8b949e// Link was re-established, just continue accepting
Te6edf3infoTff7b72!Tb4b4b4(Ta5d6ff"Ta5d6ffport {} backTa5d6ff"Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/// Note 1, we have no way of telling the server we are done with udp directly as it's connectionless but we
T8b949e/// could therotically ask the OS if that localhost udp socket we are receiving from is still open and figure
T8b949e/// out if we can safely tell the server to delete that port in the lsit. Cause right now they just stay
T8b949e/// till we disconnect the RNS link or we end the program, so we therotically could run out of
T8b949e/// udp ports server side. Not really that much of a concern cause we should have a server side
T8b949e/// limit anyways.
Tff7b72pub Tff7b72async Tff7b72fn Td2a8ffudp_tunnelTb4b4b4(Te6edf3mux: T56d364MuxHandleTb4b4b4, Te6edf3reconnect_notify: T56d364ArcTff7b72<Te6edf3NotifyTff7b72> Tb4b4b4, Te6edf3port: T56d364ForwardedPortTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3target_addr Tff7b72= Te6edf3SocketAddr::Te6edf3newTb4b4b4(Te6edf3std::Te6edf3net::Te6edf3IpAddr::Te6edf3V4Tb4b4b4(Te6edf3Ipv4Addr::Te6edf3LOCALHOSTTb4b4b4)Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3listener Tff7b72= Tff7b72match Te6edf3UdpListener::Te6edf3bindTb4b4b4(Te6edf3target_addrTb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Tffa657OkTb4b4b4(Te6edf3lTb4b4b4) Tff7b72=Tff7b72> Te6edf3lTb4b4b4,
Tffa657ErrTb4b4b4(Te6edf3_eTb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Te6edf3errorTff7b72!Tb4b4b4(Ta5d6ff"Ta5d6ffFailed to local port at {}Ta5d6ff"Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3reference Tff7b72= Tff7b72&Te6edf3muxTb4b4b4;
Tff7b72loop Tb4b4b4{
Te6edf3tokio::Te6edf3selectTff7b72! Tb4b4b4{
Te6edf3accept_result Tff7b72= Te6edf3listenerTb4b4b4.Te6edf3acceptTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Tff7b72let Tb4b4b4(Te6edf3streamTb4b4b4, Te6edf3_addrTb4b4b4) Tff7b72= Tff7b72match Te6edf3accept_result Tb4b4b4{
Tffa657OkTb4b4b4(Te6edf3saTb4b4b4) Tff7b72=Tff7b72> Te6edf3saTb4b4b4,
Tffa657ErrTb4b4b4(Te6edf3_eTb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3mux Tff7b72= Te6edf3referenceTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tff7b72!Te6edf3muxTb4b4b4.Te6edf3is_connectedTb4b4b4(Tb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Tffa657dropTb4b4b4(Te6edf3streamTb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3sid Tff7b72= Te6edf3muxTb4b4b4.Te6edf3next_session_idTb4b4b4(Tb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tff7b72let Tff7b72mut Te6edf3session_rx Tff7b72= Te6edf3muxTb4b4b4.Te6edf3register_sessionTb4b4b4(Te6edf3sidTb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tff7b72let Te6edf3mux_clone Tff7b72= Te6edf3muxTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4;
T8b949e// let connect_result = udp_bind_connect(sid,mux.clone(), &mut session_rx, target_addr).await;
Tff7b72let Te6edf3target_addr Tff7b72= Te6edf3TargetAddr::Te6edf3IpTb4b4b4(Te6edf3SocketAddr::Te6edf3newTb4b4b4(Te6edf3std::Te6edf3net::Te6edf3IpAddr::Te6edf3V4Tb4b4b4(Te6edf3Ipv4Addr::Te6edf3LOCALHOSTTb4b4b4)Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3server_port Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3tokio::Te6edf3spawnTb4b4b4(Tff7b72async Tff7b72move Tb4b4b4{
Tff7b72if Tff7b72let Tffa657OkTb4b4b4(Te6edf3_Tb4b4b4) Tff7b72= Te6edf3udp_bind_connectTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3muxTb4b4b4.Te6edf3cloneTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72&Tff7b72mut Te6edf3session_rxTb4b4b4, Te6edf3target_addr Tb4b4b4)Tb4b4b4.Tff7b72await Tb4b4b4{
Te6edf3relay_forwarded_udpTb4b4b4(Te6edf3sidTb4b4b4, Te6edf3streamTb4b4b4, Te6edf3mux_cloneTb4b4b4, Te6edf3session_rxTb4b4b4, Te6edf3portTb4b4b4.Te6edf3server_portTb4b4b4)Tb4b4b4.Tff7b72awaitTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3_ Tff7b72= Te6edf3reconnect_notifyTb4b4b4.Te6edf3notifiedTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72> Tb4b4b4{
T8b949e// Link was re-established, just continue accepting
Te6edf3infoTff7b72!Tb4b4b4(Ta5d6ff"Ta5d6ffport {} backTa5d6ff"Tb4b4b4, Te6edf3portTb4b4b4.Te6edf3client_portTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.4.2 - Generated in 0.04s